public class code1 {
//     牛客 top 101 实现数组旋转
    /**
     * 代码中的类名、方法名、参数名已经指定，请勿修改，直接返回方法规定的值即可
     *
     * 旋转数组
     * @param n int整型 数组长度
     * @param m int整型 右移距离
     * @param a int整型一维数组 给定数组
     * @return int整型一维数组
     */
    public int[] solve (int n, int m, int[] a) {

        // 这里会出现一种异常情况，当出现 n = 6 m = 7 的这种要旋转的长度大于数组本身长度的情况时
        // 此时需要特殊处理
        // 直接取 mod 即可
        m = m % n;
        // 此时就可以保证当前的 m 是有效的位置移动了

        // 通过三次的数组逆置来进行部分位置的逆置生成
        // 第一次逆置整一个长度的数组
        res(0, n - 1, a);

        // 第二次只再次逆置要移动的长度
        res(0, m - 1, a);

        // 第三次，将后面的值进行移动
        res(m, n-1, a);

        return a;
    }

    public void res(int left, int right, int[] arr) {
        while(left < right) {
            swap(arr, left++, right--);
        }
    }

    public void swap(int[] arr, int left, int right) {
        int temp = arr[left];
        arr[left] = arr[right];
        arr[right] = temp;
    }
}
